//
//  Problem1678.swift
//  TestProject
//
//  Created by 武侠 on 2021/3/15.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit
/*
 1678. 设计 Goal 解析器 【字符替换】
 请你设计一个可以解释字符串 command 的 Goal 解析器 。command 由 "G"、"()" 和/或 "(al)" 按某种顺序组成。Goal 解析器会将 "G" 解释为字符串 "G"、"()" 解释为字符串 "o" ，"(al)" 解释为字符串 "al" 。然后，按原顺序将经解释得到的字符串连接成一个字符串。
 给你字符串 command ，返回 Goal 解析器 对 command 的解释结果。

 示例 1：
     输入：command = "G()(al)"
     输出："Goal"
     解释：Goal 解析器解释命令的步骤如下所示：
     G -> G
     () -> o
     (al) -> al
     最后连接得到的结果是 "Goal"
 示例 2：
     输入：command = "G()()()()(al)"
     输出："Gooooal"
 示例 3：
     输入：command = "(al)G(al)()()G"
     输出："alGalooG"
 */
@objcMembers class Problem1678: NSObject {
    func solution() {
        print(interpret("G()(al)"))
        print(interpret("G()()()()(al)"))
        print(interpret("(al)G(al)()()G"))
        
        print(interpretCharts("G()(al)"))
        print(interpretCharts("G()()()()(al)"))
        print(interpretCharts("(al)G(al)()()G"))
    }
    
    // 使用系统替换方法
    func interpret(_ command: String) -> String {
        return command.replacingOccurrences(of: "()", with: "o").replacingOccurrences(of: "(al)", with: "al")
    }
    
    func interpretCharts(_ command: String) -> String {
        let comCharts = Array(command)
        var charts:[Character] = []
        var i = 0
        while i < comCharts.count {
            if comCharts[i] == "(" {
                if i == comCharts.count - 1 {
                    charts.append(comCharts[i])
                } else if comCharts[i+1] == ")" {
                    charts.append("o")
                    i += 1
                } else if i + 3 < comCharts.count {
                    if comCharts[i+1] == "a", comCharts[i+2] == "l", comCharts[i+3] == ")" {
                        charts.append("a")
                        charts.append("l")
                        i += 3
                    } else {
                        charts.append(comCharts[i])
                    }
                }
            } else {
                charts.append(comCharts[i])
            }
            i += 1
        }
        
        return String(charts)
    }
}
